
#include "core_board_config.h"
#include "zf_gpio.h"
#include "zf_utick.h"
#ifdef RT_THREAD
#include "rtt_device_usart.h"
#endif

void system_init (system_clock_list Clock, debug_set_list debug_en)
{
	CLOCK_EnableClock(kCLOCK_Iocon);																	// 使能 IOCON 时钟
	switch( Clock )
	{
		case CLOCKFRO12M:
			BOARD_BootClockFRO12M();																	// 设置内部 12Mhz
			break;
		case CLOCKFROHF96M:
			BOARD_BootClockFROHF96M();																	// 设置内部 96Mhz
			break;
		case CLOCKPLL100M:
			BOARD_BootClockPLL100M();																	// 设置 PLL 100Mhz
			break;
		case CLOCKPLL150M:
			BOARD_BootClockPLL150M();																	// 设置 PLL 150Mhz
			break;
		default:
			BOARD_BootClockFROHF96M();																	// 默认设置内部 96Mhz
			break;
	}

	if(debug_en)
	{
		CLOCK_EnableClock(kCLOCK_Gpio1);
		IOCON->PIO[1][29] = 
		(
			((uint32_t)PIN_FUNC_1) |																	// 设置为 FUNC1		FC7_RXD_SDA_MOSI 
			((uint32_t)PIN_MODE_INACTIVE << 4) |														// 设置为 无附加功能
			((uint32_t)PIN_SLEW_STANDARD << 6) |														// 标准模式，输出转换速率控制已启用
			((uint32_t)PIN_INVERT_DISABLED << 7) |														// 信号输入反相禁用
			((uint32_t)PIN_DIGIMODE_ENABLED << 8) |														// 使能数字模式
			((uint32_t)PIN_OD_DISABLED << 9)															// 禁止开开漏模式
		);																								// 初始化管脚 PIO1_29 为 FC7_RXD_SDA_MOSI

		IOCON->PIO[1][30] = 
		(
			((uint32_t)PIN_FUNC_1) |																	// 设置为 FUNC1		FC7_TXD_SCL_MISO
			((uint32_t)PIN_MODE_INACTIVE << 4) |														// 设置为 无附加功能
			((uint32_t)PIN_SLEW_STANDARD << 6) |														// 标准模式，输出转换速率控制已启用
			((uint32_t)PIN_INVERT_DISABLED << 7) |														// 信号输入反相禁用
			((uint32_t)PIN_DIGIMODE_ENABLED << 8) |														// 使能数字模式
			((uint32_t)PIN_OD_DISABLED << 9)															// 禁止开开漏模式
		);																								// 初始化管脚 PIO1_30 为 FC7_TXD_SCL_MISO

#ifndef RT_THREAD
		CLOCK_AttachClk(kFRO12M_to_FLEXCOMM7);
		RESET_ClearPeripheralReset(kFC7_RST_SHIFT_RSTn);
		DbgConsole_Init(7, 115200U, kSerialPort_Uart, 12000000U);
#else
		clock_attach_id_t flexcomm_clock_list[8] = 
		{
			kFRO12M_to_FLEXCOMM0, kFRO12M_to_FLEXCOMM1, kFRO12M_to_FLEXCOMM2, kFRO12M_to_FLEXCOMM3,
			kFRO12M_to_FLEXCOMM4, kFRO12M_to_FLEXCOMM5, kFRO12M_to_FLEXCOMM6, kFRO12M_to_FLEXCOMM7
		};
		reset_ip_name_t flexcomm_rest_list[8] =
		{
			kFC0_RST_SHIFT_RSTn, kFC1_RST_SHIFT_RSTn, kFC2_RST_SHIFT_RSTn, kFC3_RST_SHIFT_RSTn,
			kFC4_RST_SHIFT_RSTn, kFC5_RST_SHIFT_RSTn, kFC6_RST_SHIFT_RSTn, kFC7_RST_SHIFT_RSTn 
		};
		CLOCK_AttachClk(flexcomm_clock_list[USART_RTT_CORE0_USED]);
		RESET_ClearPeripheralReset(flexcomm_rest_list[USART_RTT_CORE0_USED]);
#endif
	}

#ifndef RT_THREAD
	zf_utick_init();																					// 使能 UTICK
#endif
}


